// 将需要嵌套执行的函数平铺，嵌套执行就是一个函数的返回值将作为另一个函数的参数。
const compose = (...fns) => fns.reduce((a, b) => (...args) => a(b(...args)))

// Test
function sum (a, b) {
    return a + b
}

function toUpper (str) {
    return str.toUpperCase()
}

function add (str) {
    return '===' + str + '==='
}

// 使用 compose 之前：
console.log(add(toUpper(sum('compose', '666')))) // ===COMPOSE666===
// 使用 compose 之后：
console.log(compose(add, toUpper, sum)('compose', '666')) // ===COMPOSE666===
